#include <iostream>

using namespace std;

/**
 * 结构体
 *  多个不同类型数据的复合体
 *  组织各种复杂数据关系的最基本的方式
 * */

/**
 * 用户信息定义结构体
 *  结构体大小的规则问题：内存对其和填充机制
 *  sizeof(tagUserInfo) = 48；为什么不是32+4+8=44，而是48呢？
 * 课后作业：
 *  查阅资料看下结构体计算大小相关的内存对其和填充机制！
 *  下面的结构体调整下字段的顺序，结构体大小会变化吗？测试下！！！
 * */
typedef struct tagStruct {
    char    a;   
    int     b;  //偏移量为4的整数倍
    double  c;  //偏移量为8的整数倍
    char    d;  //他要按照结构体中最大的元素类型的长度进行补齐，所以d会占用8个byte

    /* c++结构体允许写构造函数，进行一些初始化工作
    */
    tagStruct(){
        a = '1';
        b = 2;
        c = 3;
        d = '4';
    }
} Struct, *PStruct;

int main() {
    cout << "结构体之旅==================" << endl;

    Struct t;
    /**
     * 这个时候的t的内存数据张这样：
    0x31 0X00 0X00 0X00 //a虽然是char，占1个字节，但是因为b必须从4的整数倍开始，所以他这里被填充了3个字节
    0X02 0X00 0X00 0X00 //大端字节序情况下（课后作业：了解下大端字节序和小端字节序相关，网络传输一般是大端字节序，是约定的，但是os中多为小端字节序，好像是这个约定）
    0x03 0X00 0X00 0X00 0X00 0X00 0X00 0X00 //c本身double，占8个字节
    0x34 0X00 0X00 0X00 0X00 0X00 0X00 0X00 //d虽然占1个字节，但是需要和struct中最大的类型补齐，所有后面会有7个byte的补齐（有点浪费，可以通过调整字段的顺序减小结构体的整体大小）
    */

    cout << sizeof(Struct) << endl;
    //24

    Struct* pStruct;
    pStruct = &t;

    printf("%p\n", &t);
    printf("%p\n", pStruct);

    PStruct p = &t;
    printf("%p\n", p);

    return 0;
}
